/* watcher.js */
import Dep from "./dep.js";
import { getNestedProperty } from "./compiler.js";
export default class Watcher {
  constructor(data, key, cb) {
    // data是响应式数据
    this.data = data;
    // key 是 data 中的属性
    this.key = key;
    // cb 回调函数 更新视图的具体方法
    this.cb = cb;
    // 把观察者的存放在 Dep.target
    Dep.target = this;
    // 旧数据 更新视图的时候要进行比较
    // 在get 方法中把 观察者 通过dep.addSub(Dep.target) 添加到了依赖通知队列 dep.subs中
    this.oldValue = getNestedProperty(data, key);
    // Dep.target 就不用存在了 因为上面的操作已经存好了
    Dep.target = null;
  }
  // 观察者中的必备方法 用来更新视图
  update() {
    // 获取新值
    let newValue = getNestedProperty(this.data, this.key);
    // 比较旧值和新值
    if (newValue === this.oldValue) return;
    this.oldValue = newValue;
    // 调用具体的更新方法
    this.cb(newValue);
  }
}
